home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / MercuryMail / RESOURCE / daemon.h < prev    next >
C/C++ Source or Header  |  2004-08-09  |  37KB  |  966 lines

  1. //**
  2. //**  Mercury Mail Transport System - Daemon Interface Definitions
  3. //**  Copyright (c) 1997-99, David Harris, All Rights Reserved.
  4. //**
  5. //**  Note: the structures defined in this file are all BYTE-ALIGNED.
  6. //**  This is very important - if you are using a Borland Compiler
  7. //**  and your project uses WORD or DWORD alignment, then you will
  8. //**  need to add  "#pragma option -a1" before you include this file
  9. //**  to ensure that the compiler aligns the structures correctly.
  10. //**  Getting the byte alignment wrong will almost certainly result
  11. //**  in your Daemon crashing when you load it.
  12. //**
  13.  
  14. #ifndef _DAEMON_H
  15. #define _DAEMON_H
  16.  
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20.  
  21. #ifndef INTS_DEFINED
  22. #define INTS_DEFINED
  23. //  INT_16 and UINT_16 must be 16-bit Integer types
  24. typedef unsigned short UINT_16;
  25. typedef short INT_16;
  26. typedef unsigned long UINT_32;
  27. typedef long INT_32;
  28. #endif
  29.  
  30.  
  31. //**
  32. //**  Section 1: Data type definitions and constants for lists
  33. //**
  34.  
  35. #ifndef _LISTS_H
  36.  
  37. struct _l_node
  38.    {
  39.    unsigned int flags, number;
  40.    struct _l_node *next, *prev;
  41.    void *data;
  42.    };
  43.  
  44. typedef struct _l_node LNODE;
  45.  
  46. struct _lv_node
  47.    {
  48.    unsigned int flags, number;
  49.    struct _lv_node *next, *prev;
  50.    BYTE data [];
  51.    };
  52.  
  53. typedef struct _lv_node LVNODE;
  54.  
  55. typedef struct
  56.    {
  57.    LNODE *top, *end;          /* pointers to start/end of list */
  58.    int icount;                /* number of items in list */
  59.    unsigned isize;            /* size of *data in LNODE */
  60.    int ilimit;                /* maximum size of list - no limit if 0 */
  61.    int ialloc;                /* whether or not to allocate space for items */
  62.    unsigned int last_acc;     /* Last data accessed using get_list_data */
  63.    LNODE *last_data;          /* "   "   "   "   "   "   "   "   "    " */
  64.    } LIST;
  65.  
  66. #endif
  67.  
  68. //**
  69. //**  Section 2: Data type definitions and constants for
  70. //**  Job Management
  71. //**
  72.  
  73. //  Rewind flags - passed to ji_rewind_job
  74.  
  75. #define JR_CONTROL 1
  76. #define JR_DATA    2
  77.  
  78. //  Diagnostic flags - passed to ji_set/get_diagnostics
  79.  
  80. #define JD_ELEMENT 1
  81. #define JD_JOB 2
  82.  
  83. typedef struct
  84.    {
  85.    int structlen;
  86.    char jobstatus;
  87.    long jobflags;
  88.    char status;
  89.    char *from;
  90.    char *to;
  91.    long dsize;
  92.    long rsize;
  93.    int total_rcpts;
  94.    int total_failures;
  95.    int total_retries;
  96.    char ip1 [16];
  97.    char ip2 [16];
  98.    char ip3 [16];
  99.    char ip4 [16];
  100.    char jobid [20];
  101.    } JOBINFO;
  102.  
  103. enum                 //  Job types, for ji_scan_* and ji_create_job
  104.    {
  105.    JT_GENERAL,       //  Local and newly-submitted mail
  106.    JT_OUTGOING,      //  Only mail destined for the outside world
  107.    JT_ANY            //  Any type of job
  108.    };
  109.  
  110. enum                 //  "mode" values for ji_set_element_status
  111.    {
  112.    JS_COMPLETED,     //  "date" is ignored
  113.    JS_FAILED,        //  "date" is ignored
  114.    JS_RETRY,         //  "date" is used for requeuing if non-NULL
  115.    JS_PENDING,       //  "date" is ignored
  116.    JS_TEMP_FAIL      //  "date" is ignored
  117.    };
  118.  
  119. enum                 //  "type" values for ji_get_next_element
  120.    {
  121.    JE_ANY,           //  Any type of element is OK
  122.    JE_READY,         //  Only return elements ready to be sent
  123.    JE_FAILED,        //  Only return elements marked as failed
  124.    JE_COMPLETED,     //  Only return elements marked as completed
  125.    JE_PENDING,       //  Only return elements marked as "pending"
  126.    JE_TEMP_FAIL      //  Only return elements marked as temporarily failed
  127.    };
  128.  
  129.  
  130. //**
  131. //**  Section 3: General Mercury data type and constant definitions
  132. //**  Many of these structures are not directly used by Daemons.
  133. //**
  134.  
  135. #ifndef MAXFPATH
  136. #define MAXFPATH 128
  137. #endif
  138.  
  139. #ifndef size
  140. #define size(x) (sizeof (x) / sizeof (x [0]))
  141. #endif
  142.  
  143. #define MAXUIC 128
  144. #define MAXHOST 128
  145.  
  146. //  Statistics manager constants.
  147.  
  148. #define STC_INTEGER 0
  149. #define STC_STRING 1
  150. #define STC_DATE 2
  151.  
  152. #define STF_CUMULATIVE 1
  153. #define STF_PEAK 2
  154. #define STF_UNIQUE 4
  155.  
  156. //  Logging console manager priority constants
  157.  
  158. #define LOG_DEBUG 25
  159. #define LOG_INFO  20
  160. #define LOG_NORMAL 15
  161. #define LOG_SIGNIFICANT 10
  162. #define LOG_URGENT 5
  163. #define LOG_NONE 0
  164.  
  165. //  Constants that can be passed to "create_object"
  166.  
  167. #define OBJ_USER 1
  168. #define OBJ_ADMINISTRATOR 2
  169.  
  170. typedef unsigned char UCHAR;
  171. typedef unsigned short USHORT;
  172. typedef unsigned long ULONG;
  173.  
  174. //  INT_16 and UINT_16 must be 16-bit Integer types
  175. typedef unsigned short UINT_16;
  176. typedef short INT_16;
  177.  
  178. typedef struct
  179.    {
  180.    char auto_forward [60];
  181.    char gw_auto_forward [60];  // Mercury uses this field for forwarding
  182.    char from_alias [60];       // Alternative From: field value
  183.    unsigned flags;
  184.    char security;
  185.    } PMPROP;
  186.  
  187. typedef struct
  188.    {
  189.    char *name;
  190.    char *domain;
  191.    char *login_name;
  192.    char *password;
  193.    } SERVER_ID;
  194.  
  195. typedef struct
  196.    {
  197.    char *name;
  198.    char *groupname;
  199.    char *hostname;
  200.    } GROUP_ID;
  201.  
  202. typedef struct
  203.    {
  204.    char *match;
  205.    char *rewrite;
  206.    } REWRITE;
  207.  
  208. typedef struct
  209.    {
  210.    char lname [48];
  211.    char fname [128];           // Name of container file for list
  212.    char moderator [80];        // Primary list moderator (if any)
  213.    char title [80];            // Title for list (used in "to" field
  214.    char welcome_file [128];    // File to send to new subscribers
  215.    char farewell_file [128];   // File to send to unsubscribers
  216.    char ispublic;              // NZ if open subscription is available
  217.    char matched;               // NZ if the address passed in is a moderator
  218.    char moderated;             // NZ if mailing to the list is restricted
  219.    char allow_enumeration;     // NZ if anyone may use ENUMERATE
  220.    char reply_to_list;         // NZ if replies should go to the list
  221.    int limit;                  // Maximum allowable number of subscribers
  222.    char errors_to [80];        // Address to which errors should be referred
  223.    char restricted;            // NZ if only list members may mail to the list
  224.    int fanout;                 // Number of jobs to "fan" the delivery to
  225.    char anonymous;             // Whether this list is anonymous or not
  226.    char title_is_address;      // If NZ, the 'title' field contains an address
  227.    char digest_name [14];      // Name of digest file
  228.    unsigned long digest_maxsize;
  229.    int digest_maxwait;
  230.    char archive_file [128];    // File into which to archive messages
  231.    char digest_default;        // If NZ, new users are default to digest mode
  232.    char list_headers;          // Use IETF draft helper headers
  233.    char list_help [80];        // Help URL
  234.    char list_signature [128];  // List's signature file
  235.    char concealed;             // If NZ, do not publicize via the maiser LIST
  236.    long maximum_size;          // Largest message that may be submitted to list
  237.    char password [128];        // Moderator password or password filename
  238.    char pwd_is_filename;       // NZ if "password" is a filename
  239.    } DLIST;
  240.  
  241. #define FS_BOLD               1
  242. #define FS_ITALIC             2
  243. #define FS_FIXED              4
  244. #define FS_OEMCHARS           8
  245.  
  246. typedef struct
  247.    {
  248.    char fontname [LF_FACESIZE];
  249.    INT_16 fontsize, style;
  250.    } FONTSPEC;
  251.  
  252. typedef struct
  253.    {
  254.    char alias [60];
  255.    char obj_name [48];
  256.    char server [48];
  257.    long flags;       /* Unused at present - might be handy later */
  258.    } CHBIND;
  259.  
  260. typedef struct
  261.    {
  262.    char alias [180], name [180];
  263.    } ALIAS;
  264.  
  265.  
  266. //  IMESSAGE structure definition:
  267. //  The IMESSAGE structure is used internally to represent messages
  268. //  and pseudo-messages. This structure exactly parallels a structure
  269. //  used in Pegasus Mail v3.x and later for the same purpose, and is
  270. //  included in this way to allow maximum code portability between
  271. //  the two.
  272.  
  273. typedef struct
  274.    {
  275.    INT_16 dsize;               //  The size of this data structure
  276.    INT_16 mtype;               //  User-defined message type field
  277.    UINT_32 flags;              //  First bank of message-related flags
  278.    UINT_32 flags2;             //  Second bank of message-related flags
  279.    char fname [14];            //  Recommended filename for message
  280.    char from [42];             //  The sender of the message
  281.    char subject [50];          //  Can you guess what this is?
  282.    UCHAR cdate [8];            //  Timezone-corrected date from message
  283.    UCHAR date [8];             //  Raw RFC822 time and date for message
  284.    UINT_32 fsize;              //  Raw size of this message
  285.    UINT_16 colour;             //  Display colour for this entry
  286.    UINT_16 charset;            //  Character set for message
  287.    char unique_id [34];        //  Unique ID for the message
  288.    void *folder;               //  Currently unused in Mercury/32
  289.    char filename [128];        //  The file containing the message data
  290.    } IMESSAGE;
  291.  
  292. //  Explanation of fields:
  293. //  "dsize"      The allocated size of this data structure
  294. //  "mtype"      The user can define message types that can be used for sorting
  295. //  "flags"      Can contain any of the flag values shown in Group 1 below
  296. //  "flags2"     Can contain any of the flag values shown in Group 2 below
  297. //  "fname"      Recommended filename for any storage to do with the message
  298. //  "from"       Display version of sender's address
  299. //  "subject"    Display version of message subject
  300. //  "date"       The date as shown in the message's RFC822 "Date:" field
  301. //  "cdate"      The date the message arrived at the local system.
  302. //             - See below for more on the date format
  303. //  "fsize"      Raw size of the message, including headers and formatting
  304. //               Note - no allowance is made for CR/LF conversions.
  305. //  "colour"     Index into colour table for message display colour
  306. //  "charset"    Index into character set table for message charset format
  307. //  "unique_id"  Guaranteed unique persistent global identifier for this message
  308. //  "folder"     The folder in which this message is currently stored.
  309. //
  310. //  Date format: dates in IMESSAGEs use the NetWare 7-byte date format plus an
  311. //  extra byte containing the offset in half-hour units from GMT. The date is
  312. //  always pre-corrected to GMT by WinPMail. Note that byte 0 (the year) is
  313. //  always the actual year - 1900, so the year 2000 is represented by 100.
  314. //  The NetWare date format is as shown:
  315. //
  316. //    Byte 0  - Year - 1900 (i.e, 2005 = 105)
  317. //    Byte 1  - Month (ie, January == 1)
  318. //    Byte 2  - Day (1 .. 31)
  319. //    Byte 3  - Hour (0 - 24)
  320. //    Byte 4  - Minute (0 - 59)
  321. //    Byte 5  - Second (0 - 60)
  322. //    Byte 6  - Day of week (Sunday == 0)   ("255" == "not calculated")
  323.  
  324. //
  325. //  Group 1 flag values - these can be used in an IMESSAGE "flags" field.
  326. //
  327. #define FILE_MAILED              1  // The message contains a mailed file
  328. #define UUENCODED                2  // The message contains uuencoded data
  329. #define FILE_ATTACHED    0x800003L  // Use this as an attachment mask.
  330. #define ENCRYPTED                4  // The message is encrypted
  331. #define EXPIRED                 16  // The message is past its expiry date
  332. #define FILE_ASCII              32  // Flag in attachment to indicate ASCII file
  333. #define HAS_BEEN_READ          128  // Hey, what do you know! It's been read!
  334. #define ALTERNATIVE          0x100  // The message is Multipart/Alternative type
  335. #define IS_HTML              0x200  // The message is Text/HTML type
  336. #define IS_CIRCULAR          0x400  // The message is being circulated
  337. #define CONFIRMATION        0x2000  // Sender wants confirmation of reading
  338. #define FORWARD            0x8000L  // The message is being forwarded
  339. #define IS_RTF            0x10000L  // Message contains MS-RTF data
  340. #define COPYSELF          0x20000L  // The message is a copy to self
  341. #define DELETED           0x40000L  // The message has been deleted.
  342. #define MIME              0x80000L  // The message is a MIME transmission
  343. #define REPLIED          0x100000L  // The message has been replied to.
  344. #define FORWARDED        0x200000L  // The message has been forwarded.
  345. #define URGENT           0x400000L  // The message is urgent/high priority.
  346. #define BINHEX           0x800000L  // The message is a BinHex file
  347. #define IS_MHS          0x1000000L  // The message originates from MHS
  348. #define IS_SMTP         0x2000000L  // The message originated via SMTP
  349. #define IS_ANNOTATED    0x4000000L  // The message has an annotation
  350. #define ENCLOSURE       0x8000000L  // The message has an enclosure
  351. #define HIGHLIGHTED    0x10000000L  // The message has transient significance
  352. #define MIME_MULTI     0x20000000L  // The message is in MIME Multipart format
  353. #define TEXT_ENRICHED  0x40000000L  // The message is in "text/enriched" format
  354. #define READ_ONLY      0x80000000L  // The message may not be deleted
  355.  
  356. //
  357. //  Group 2 flag values - these can be used in an IMESSAGE "flags2" field
  358. //
  359.  
  360. #define IS_NEWMAIL               1  // The message is in the new mail folder
  361. #define IS_NOTICE                2  // The message comes from a noticeboard
  362. #define IS_TEMPORARY             4
  363.  
  364.  
  365. //  MIME parsing definitions and structures
  366.  
  367. enum     //  Content dispositions
  368.    {
  369.    MD_ATTACHMENT, MD_INLINE
  370.    };
  371.  
  372. enum     // The primary types
  373.    {
  374.    MP_TEXT, MP_MULTIPART, MP_MESSAGE, MP_APPLICATION,
  375.    MP_IMAGE, MP_VIDEO, MP_AUDIO, MP_UNKNOWN
  376.    };
  377.  
  378. enum     // TEXT subtypes
  379.    {
  380.    MPT_PLAIN, MPT_RICHTEXT, MPT_HTML, MPT_RTF, MPT_UNKNOWN
  381.    };
  382.  
  383. enum     // MULTIPART subtypes
  384.    {
  385.    MPP_MIXED, MPP_ALTERNATIVE, MPP_DIGEST,
  386.    MPP_PARALLEL, MPP_UNKNOWN
  387.    };
  388.  
  389. enum     // MESSAGE subtypes
  390.    {
  391.    MPM_RFC822, MPM_PARTIAL, MPM_EXTERNAL_BODY, MPM_UNKOWN
  392.    };
  393.  
  394. enum     // APPLICATION subtypes
  395.    {
  396.    MPA_OCTET_STREAM, MPA_POSTSCRIPT, MPA_ODA, MPA_BINHEX, MPA_UNKNOWN
  397.    };
  398.  
  399. enum     // IMAGE subtypes
  400.    {
  401.    MPI_GIF, MPI_JPEG, MPI_UNKNOWN
  402.    };
  403.  
  404. enum     // VIDEO subtypes
  405.    {
  406.    MPV_MPEG, MPV_UNKNOWN
  407.    };
  408.  
  409. enum     // AUDIO subtypes
  410.    {
  411.    MPU_BASIC, MPU_UNKNOWN
  412.    };
  413.  
  414. enum     // MIME transfer-encodings
  415.    {
  416.    //  Note that ME_BINHEX and ME_UUENCODE are handled as special
  417.    //  cases and as such must always appear after ME_UNKNOWN.
  418.    ME_7BIT, ME_8BIT, ME_QUOTED_PRINTABLE, ME_BASE64, ME_UNKNOWN,
  419.    ME_BINHEX, ME_UUENCODE
  420.    };
  421.  
  422. typedef struct
  423.    {
  424.    char charset [20];
  425.    char *table;
  426.    } MPT;
  427.  
  428. typedef struct
  429.    {
  430.    char boundary [71];
  431.    LIST partlist;
  432.    } MPP;
  433.  
  434. typedef struct
  435.    {
  436.    char fname [96];
  437.    char type [20];
  438.    } MPA;
  439.  
  440. typedef struct
  441.    {
  442.    int primary, secondary, encoding, disposition;
  443.    char p_string [20], s_string [20];
  444.    char description [48];
  445.    char encryptor [16];    //  For encrypted attachments, the encryptor
  446.    int encryptor_flags;
  447.    int section;
  448.    char fname [96];
  449.    union
  450.       {
  451.       MPT mpt;
  452.       MPP mpp;
  453.       MPA mpa;
  454.       IMESSAGE mpm;
  455.       } d;
  456.    } IMIME;
  457.  
  458.  
  459. //**
  460. //**  Section 4: Constants for message composition functions
  461. //**
  462.  
  463. #define OM_M_8BIT 1
  464.  
  465. #define OM_MT_PLAIN 0         //  A simple, single-part text/plain message
  466. #define OM_MT_MULTIPART 1     //  A multipart/mixed message
  467. #define OM_MT_ALTERNATIVE 2   //  A multipart/alternative message
  468. #define OM_MT_DIGEST 3        //  A multipart/digest type
  469.  
  470. #define OM_MF_TO 1            //  Set the master recipient of the message
  471. #define OM_MF_SUBJECT 2       //  Set the subject field for the message
  472. #define OM_MF_CC 3            //  Set the secondary recipients of the message
  473. #define OM_MF_FROM 4          //  Set the originator of the message.
  474. #define OM_MF_BODY 5          //  Set the filename containing the message body
  475. #define OM_MF_RAW  6          //  Add a raw header for the message.
  476. #define OM_MF_FLAGS 7         //  Set the message's "flags" field
  477.  
  478. #define OM_AE_DEFAULT 0       //  Default encoding (MIME BASE64 encoding)
  479. #define OM_AE_TEXT 1          //  Simple textual data, unencoded
  480. #define OM_AE_UUENCODE 2      //  Uuencoding
  481. #define OM_AE_BINHEX 3        //  Macintosh Binhex format (data fork only)
  482.  
  483. #define OM_AF_INLINE 1        //  Write the file as a simple textual section
  484. #define OM_AF_MESSAGE 2       //  Write the message as a Message/RFC822 part
  485.  
  486.  
  487. //**
  488. //**  Section 5: Protocol Module parameter block definition;
  489. //**  Daemons are passed a Protocol Module parameter block.
  490. //**
  491.  
  492. #define GV_QUEUENAME 1
  493. #define GV_SMTPQUEUENAME 2
  494. #define GV_MYNAME 3
  495. #define GV_TTYFONT 4
  496. #define GV_MAISERNAME 5
  497. #define GV_FRAMEWINDOW 6
  498. #define GV_SYSFONT 7
  499. #define GV_BASEDIR 8
  500. #define GV_SCRATCHDIR 9
  501.  
  502. #define SYSTEM_PASSWORD 1
  503. #define APOP_SECRET 2
  504. #define PASSWD_MUST_EXIST 256
  505.  
  506. //  Messages that protocol modules can send using the
  507. //  "mercury_command" function in the protocol parameter block
  508.  
  509. //  GET_MODULE_INTERFACE:
  510. //    - "parm1" - char * pointer to name of module to locate
  511. //    - Returns: the command interface function for the module, or NULL
  512. #define GET_MODULE_INTERFACE 1
  513.  
  514. //  ADD_ALIAS
  515. //    - "parm1" - char * pointer to alias to add
  516. //      "parm2" - char * pointer to real-world address string
  517. //    - Returns: NZ on success, 0 on failure
  518. #define ADD_ALIAS 2
  519.  
  520. //  DELETE_ALIAS
  521. //    - "parm1" - char * pointer to alias field of alias to delete
  522. //      Returns: NZ on success, 0 on failure
  523. #define DELETE_ALIAS 3
  524.  
  525. //  RESOLVE_ALIAS
  526. //    - "parm1" - char * pointer to buffer to receive address (180 char min)
  527. //      "parm2" - char * pointer to alias to resolve
  528. //    - Returns: NZ if a match was found, 0 if none was found.
  529. #define RESOLVE_ALIAS 4
  530.  
  531. //  RESOLVE_SYNONYM
  532. //    - "parm1" - char * pointer to buffer to receive address (180 char min)
  533. //      "parm2" - char * pointer to synonym to resolve
  534. //    - Returns: NZ if a match was found, 0 if none was found
  535. #define RESOLVE_SYNONYM 5
  536.  
  537. //  QUEUE_STATE - enable or disable queue processing
  538. //    - "parm1" - 0 to query current state, 1 to set state
  539. //      "parm2" - 1 to pause processing, 0 to enable it
  540. //    - Returns:  The state of queue processing prior to the call
  541. #define QUEUE_STATE 6
  542.  
  543. //  DISPLAY_HELP
  544. //    - "parm1" - section number in MERCURY.HLP
  545. //      "parm2" - unused, must be 0
  546. //    - Returns:  Nothing.
  547. #define DISPLAY_HELP 512
  548.  
  549. #define NOT_IMPLEMENTED 0xF0000000L
  550.  
  551. #define RFC_822_TIME 0
  552. #define RFC_821_TIME 1
  553.  
  554. typedef DWORD (*GET_VARIABLE) (int index);
  555. typedef int (*IS_LOCAL_ADDRESS) (char *address, char *uic, char *server);
  556. typedef int (*GET_DELIVERY_PATH) (char *path, char *username, char *host);
  557.  
  558. typedef int (*IS_GROUP) (char *address, char *host, char *groupname);
  559. typedef int (*PARSE_ADDRESS) (char *target, char *source, int limit);
  560. typedef int (*EXTRACT_ONE_ADDRESS) (char *dest, char *source, int offset);
  561. typedef void (*EXTRACT_CQTEXT) (char *dest, char *source, int len);
  562. typedef int (*DLIST_INFO) (DLIST *dlist, char *lname, int num, char *address,
  563.    char *errbuf, LIST *modlist);
  564. typedef void (*SEND_NOTIFICATION) (char *username, char *host, char *message);
  565. typedef int (*GET_DATE_AND_TIME) (BYTE *tm);
  566. typedef INT_32 (*VERIFY_PASSWORD) (char *username, char *host,
  567.    char *password, INT_32 select);
  568. typedef int (*WRITE_PROFILE) (char *section, char *fname);
  569. typedef int (*MODULE_STATE) (char *modname, int set_value, int state);
  570.  
  571. //  Job control functions
  572.  
  573. typedef void * (*JI_SCAN_FIRST_JOB) (int type, int mode, void **data);
  574. typedef void * (*JI_SCAN_NEXT_JOB) (void **data);
  575. typedef void (*JI_END_SCAN) (void **data);
  576.  
  577. typedef int (*JI_OPEN_JOB) (void *jobhandle);
  578. typedef int (*JI_CLOSE_JOB) (void *jobhandle);
  579. typedef void (*JI_REWIND_JOB) (void *jobhandle, int flags);
  580. typedef int (*JI_DISPOSE_JOB) (void *jobhandle);
  581. typedef int (*JI_PROCESS_JOB) (void *jobhandle);
  582. typedef int (*JI_DELETE_JOB) (void *jobhandle);
  583. typedef int (*JI_ABORT_JOB) (void *jobhandle, int fatal);
  584. typedef int (*JI_GET_JOB_INFO) (void *jobhandle, JOBINFO *ji);
  585.  
  586. typedef void * (*JI_CREATE_JOB) (int type, char *from,
  587.    unsigned char *start_time);
  588. typedef int (*JI_ADD_ELEMENT) (void *jobhandle, char *address);
  589. typedef int (*JI_ADD_DATA) (void *jobhandle, char *data);
  590. typedef char * (*JI_GET_DATA) (void *jobhandle, char *buffer, int buflen);
  591.  
  592. typedef char * (*JI_GET_NEXT_ELEMENT) (void *jobhandle, int type, JOBINFO *job);
  593. typedef int (*JI_SET_JOB_FLAGS) (void *jobhandle, long flags);
  594. typedef int (*JI_SET_ELEMENT_STATUS) (void *jobhandle, int mode,
  595.    unsigned char *date);
  596. typedef int (*JI_SET_ELEMENT_RESOLVINFO) (void *jobhandle, char *ip1, char *ip2,
  597.    char *ip3, char *ip4);
  598.  
  599. typedef int (*JI_SET_DIAGNOSTICS) (void *jobhandle, int forwhat, char *text);
  600. typedef int (*JI_GET_DIAGNOSTICS) (void *jobhandle, int forwhat, char *fname);
  601.  
  602. typedef void (*JI_INCREMENT_TIME) (unsigned char *tm, unsigned int secs);
  603.  
  604. typedef long (*JI_TELL) (void *jobhandle, int selector);
  605. typedef int (*JI_SEEK) (void *jobhandle, long ofs, int selector);
  606.  
  607. typedef void * (*JI_GET_JOB_BY_ID) (char *id);
  608. typedef int (*JI_GET_JOB_TIMES) (void *job, char *submitted, char *ready);
  609.  
  610. //  MNICA functions
  611.  
  612. typedef int (*GET_FIRST_GROUP_MEMBER) (char *group, char *host, char *member,
  613.    int mlen, void **data);
  614. typedef int (*GET_NEXT_GROUP_MEMBER) (char *member, int mlen, void **data);
  615. typedef int (*END_GROUP_SCAN) (void **data);
  616. typedef int (*IS_VALID_LOCAL_USER) (char *address, char *username, char *host);
  617. typedef int (*IS_GROUP_MEMBER) (char *host, char *username, char *groupname);
  618. typedef int (*GET_FIRST_USER_DETAILS) (char *host, char *match, char *username,
  619.    int ulen, char *address, int alen, char *fullname, int flen, void **data);
  620. typedef int (*GET_NEXT_USER_DETAILS) (char *username, int ulen, char *address,
  621.    int alen, char *fullname, int flen, void **data);
  622. typedef int (*GET_USER_DETAILS) (char *host, char *match, char *username, int ulen,
  623.    char *address, int alen, char *fullname, int flen);
  624. typedef int (*END_USER_SCAN) (void **data);
  625. typedef void (*READ_PMPROP) (char *userid, char *server, PMPROP *p);
  626. typedef int (*CHANGE_OWNERSHIP) (char *fname, char *host, char *newowner);
  627. typedef int (*BEGIN_SINGLE_DELIVERY) (char *uic, char *server, void **data);
  628. typedef void (*END_SINGLE_DELIVERY) (void **data);
  629.  
  630. //  Miscellaneous functions - Mercury 2.11 and later only
  631.  
  632. typedef DWORD (*MERCURY_COMMAND) (DWORD selector, DWORD parm1, DWORD parm2);
  633. typedef char * (*GET_DATE_STRING) (int dtype, char *buf, BYTE *date);
  634. typedef char * (*RFC822_TIME) (char *buffer);
  635. typedef char * (*RFC821_TIME) (char *buffer);
  636.  
  637. //  File I/O and parsing functions - Mercury 2.15 and later only
  638.  
  639. typedef INT_32 (*FM_OPEN_FILE) (char *path, UINT_32 flags);
  640. typedef INT_32 (*FM_OPEN_MESSAGE) (IMESSAGE *im, UINT_32 flags);
  641. typedef int (*FM_CLOSE_MESSAGE) (INT_32 id);
  642. typedef char * (*FM_GETS) (char *buf, INT_32 max, INT_32 id);
  643. typedef INT_16 (*FM_GETC) (INT_32 id);
  644. typedef void (*FM_UNGETC) (INT_16 c, INT_32 id);
  645. typedef INT_32 (*FM_READ) (INT_32 id, char *buffer, INT_32 bufsize);
  646. typedef INT_32 (*FM_GETPOS) (INT_32 fil);
  647. typedef INT_16 (*FM_SETPOS) (INT_32 fil, INT_32 offset);
  648. typedef INT_32 (*FM_GET_FOLDED_LINE) (INT_32 fil, char *line, int limit);
  649. typedef char * (*FM_FIND_HEADER) (INT_32 fil, char *name, char *buf, int len);
  650. typedef int (*FM_EXTRACT_MESSAGE) (void *job, char *fname, int flags);
  651.  
  652. typedef int (*PARSE_HEADER) (INT_32 fil, IMESSAGE *m);
  653. typedef int (*MIME_PREP_MESSAGE) (INT_32 fil, char *fname, int headers);
  654. typedef int (*PARSE_MIME) (INT_32 fil, IMIME *m);
  655. typedef void (*FREE_MIME) (IMIME *m);
  656. typedef int (*FAKE_IMESSAGE) (IMESSAGE *im, char *dest, char *src,
  657.    IMIME *m, char *boundary);
  658. typedef int (*DECODE_MIME_HEADER) (char *dest, char *src);
  659. typedef int (*ENCODE_MIME_HEADER) (char *dest, char *src, int raw);
  660.  
  661. typedef void * (*OM_CREATE_MESSAGE) (UINT_32 mtype, UINT_32 flags);
  662. typedef INT_32 (*OM_DISPOSE_MESSAGE) (void *mhandle);
  663. typedef INT_32 (*OM_ADD_FIELD) (void *mhandle, UINT_32 selector, char *data);
  664. typedef INT_32 (*OM_ADD_ATTACHMENT) (void *mhandle, char *fname, char *ftype,
  665.    char *description, UINT_32 encoding, UINT_32 flags, void *reserved);
  666. typedef INT_32 (*OM_WRITE_MESSAGE) (void *mhandle, char *fname);
  667. typedef void * (*OM_SEND_MESSAGE) (void *mhandle, char *envelope);
  668.  
  669. typedef int (*ENCODE_BASE64_STR) (char *dest, char *src, int srclen);
  670. typedef int (*DECODE_BASE64_STR) (char *dest, char *src, char *table);
  671.  
  672. typedef INT_32 (*ST_REGISTER_MODULE) (char *module_name);
  673. typedef INT_32 (*ST_UNREGISTER_MODULE) (INT_32 mhandle);
  674. typedef INT_32 (*ST_CREATE_CATEGORY) (INT_32 mhandle, char *cname,
  675.    INT_32 ctag, INT_32 ctype, INT_32 dlen, UINT_32 flags);
  676. typedef INT_32 (*ST_REMOVE_CATEGORY) (INT_32 mhandle, UINT_32 ctag);
  677. typedef INT_32 (*ST_SET_HCATEGORY) (INT_32 chandle, UINT_32 data);
  678. typedef INT_32 (*ST_SET_CATEGORY) (INT_32 mhandle, INT_32 ctag, UINT_32 data);
  679.  
  680. typedef void (*LOGSTRING) (INT_16 ltype, INT_16 priority, char *str);
  681. typedef void (*LOGDATA) (INT_16 ltype, INT_16 priority, char *fmt, ...);
  682.  
  683. typedef INT_32 (*CREATE_OBJECT) (char *objectname, INT_32 objecttype,
  684.    char *id, INT_32 flags);
  685. typedef INT_32 (*SET_PASSWORD) (char *username, char *host, char *newpassword,
  686.    char *oldpassword, INT_32 select);
  687.  
  688. typedef INT_32 (*ST_GET_NEXT_MODULE) (INT_32 mhandle, char *modname);
  689. typedef INT_32 (*ST_GET_NEXT_CATEGORY) (INT_32 mhandle, INT_32 chandle,
  690.    char *cname, INT_32 *ctype, INT_32 *clen, INT_32 *cflags);
  691. typedef INT_32 (*ST_GET_CATEGORY_DATA) (INT_32 chandle, void *data);
  692. typedef INT_32 (*ST_EXPORT_STATS) (INT_32 mhandle, char *fname, UINT_32 flags);
  693.  
  694. typedef INT_32 (*SELECT_PRINTER) (char *devicename, int maxlen);
  695. typedef INT_32 (* PRINT_FILE) (char *fname, char *printername, UINT_32 flags,
  696.    INT_32 lrmargin, INT_32 tbmargin, char *title, char *username, char *fontname,
  697.    INT_32 fontsize);
  698.  
  699. typedef struct
  700.    {
  701.    long dsize;                              //  Size of this structure
  702.    char vmajor, vminor;
  703.    HWND hMDIParent;
  704.    GET_VARIABLE get_variable;
  705.    IS_LOCAL_ADDRESS is_local_address;
  706.    IS_GROUP is_group;
  707.    PARSE_ADDRESS parse_address;
  708.    EXTRACT_ONE_ADDRESS extract_one_address;
  709.    EXTRACT_CQTEXT extract_cqtext;
  710.    DLIST_INFO dlist_info;
  711.    SEND_NOTIFICATION send_notification;
  712.    GET_DELIVERY_PATH get_delivery_path;
  713.    GET_DATE_AND_TIME get_date_and_time;
  714.    VERIFY_PASSWORD verify_password;
  715.    WRITE_PROFILE write_profile;
  716.    MODULE_STATE module_state;
  717.  
  718.    //  Job control functions
  719.  
  720.    JI_SCAN_FIRST_JOB ji_scan_first_job;
  721.    JI_SCAN_NEXT_JOB ji_scan_next_job;
  722.    JI_END_SCAN ji_end_scan;
  723.    JI_OPEN_JOB ji_open_job;
  724.    JI_CLOSE_JOB ji_close_job;
  725.    JI_REWIND_JOB ji_rewind_job;
  726.    JI_DISPOSE_JOB ji_dispose_job;
  727.    JI_PROCESS_JOB ji_process_job;
  728.    JI_DELETE_JOB ji_delete_job;
  729.    JI_ABORT_JOB ji_abort_job;
  730.    JI_GET_JOB_INFO ji_get_job_info;
  731.    JI_CREATE_JOB ji_create_job;
  732.    JI_ADD_ELEMENT ji_add_element;
  733.    JI_ADD_DATA ji_add_data;
  734.    JI_GET_DATA ji_get_data;
  735.    JI_GET_NEXT_ELEMENT ji_get_next_element;
  736.    JI_SET_ELEMENT_STATUS ji_set_element_status;
  737.    JI_SET_ELEMENT_RESOLVINFO ji_set_element_resolvinfo;
  738.    JI_SET_DIAGNOSTICS ji_set_diagnostics;
  739.    JI_GET_DIAGNOSTICS ji_get_diagnostics;
  740.    JI_INCREMENT_TIME ji_increment_time;
  741.  
  742.    //  MNICA (Network interface) functions
  743.  
  744.    GET_FIRST_GROUP_MEMBER get_first_group_member;
  745.    GET_NEXT_GROUP_MEMBER get_next_group_member;
  746.    END_GROUP_SCAN end_group_scan;
  747.    IS_VALID_LOCAL_USER is_valid_local_user;
  748.    IS_GROUP_MEMBER is_group_member;
  749.    GET_FIRST_USER_DETAILS get_first_user_details;
  750.    GET_NEXT_USER_DETAILS get_next_user_details;
  751.    GET_USER_DETAILS get_user_details;
  752.    END_USER_SCAN end_user_scan;
  753.    READ_PMPROP read_pmprop;
  754.    CHANGE_OWNERSHIP change_ownership;
  755.    BEGIN_SINGLE_DELIVERY begin_single_delivery;
  756.    END_SINGLE_DELIVERY end_single_delivery;
  757.  
  758.    //  Miscellaneous functions
  759.  
  760.    MERCURY_COMMAND mercury_command;
  761.    GET_DATE_STRING get_date_string;
  762.    RFC822_TIME rfc822_time;
  763.    RFC821_TIME rfc821_time;
  764.  
  765.    //  File parsing and I/O functions
  766.  
  767.    FM_OPEN_FILE fm_open_file;
  768.    FM_OPEN_MESSAGE fm_open_message;
  769.    FM_CLOSE_MESSAGE fm_close_message;
  770.    FM_GETS fm_gets;
  771.    FM_GETC fm_getc;
  772.    FM_UNGETC fm_ungetc;
  773.    FM_READ fm_read;
  774.    FM_GETPOS fm_getpos;
  775.    FM_SETPOS fm_setpos;
  776.    FM_GET_FOLDED_LINE fm_get_folded_line;
  777.    FM_FIND_HEADER fm_find_header;
  778.    FM_EXTRACT_MESSAGE fm_extract_message;
  779.  
  780.    PARSE_HEADER parse_header;
  781.    MIME_PREP_MESSAGE mime_prep_message;
  782.    PARSE_MIME parse_mime;
  783.    FREE_MIME free_mime;
  784.    FAKE_IMESSAGE fake_imessage;
  785.    DECODE_MIME_HEADER decode_mime_header;
  786.    ENCODE_MIME_HEADER encode_mime_header;
  787.  
  788.    OM_CREATE_MESSAGE om_create_message;
  789.    OM_DISPOSE_MESSAGE om_dispose_message;
  790.    OM_ADD_FIELD om_add_field;
  791.    OM_ADD_ATTACHMENT om_add_attachment;
  792.    OM_WRITE_MESSAGE om_write_message;
  793.    OM_SEND_MESSAGE om_send_message;
  794.  
  795.    ENCODE_BASE64_STR encode_base64_str;
  796.    DECODE_BASE64_STR decode_base64_str;
  797.  
  798.    ST_REGISTER_MODULE st_register_module;
  799.    ST_UNREGISTER_MODULE st_unregister_module;
  800.    ST_CREATE_CATEGORY st_create_category;
  801.    ST_REMOVE_CATEGORY st_remove_category;
  802.    ST_SET_HCATEGORY st_set_hcategory;
  803.    ST_SET_CATEGORY st_set_category;
  804.  
  805.    JI_TELL ji_tell;
  806.    JI_SEEK ji_seek;
  807.    JI_SET_JOB_FLAGS ji_set_job_flags;
  808.  
  809.    LOGSTRING logstring;
  810.    LOGDATA logdata;
  811.  
  812.    CREATE_OBJECT create_object;
  813.    SET_PASSWORD set_password;
  814.  
  815.    ST_GET_NEXT_MODULE st_get_next_module;
  816.    ST_GET_NEXT_CATEGORY st_get_next_category;
  817.    ST_GET_CATEGORY_DATA st_get_category_data;
  818.    ST_EXPORT_STATS st_export_stats;
  819.  
  820.    JI_GET_JOB_BY_ID ji_get_job_by_id;
  821.    JI_GET_JOB_TIMES ji_get_job_times;
  822.  
  823.    SELECT_PRINTER select_printer;
  824.    PRINT_FILE print_file;
  825.    } M_INTERFACE;
  826.  
  827.  
  828. #ifdef USES_M_INTERFACE
  829.  
  830. //  Convenience macros: allow calls to internal Mercury functions to
  831. //  be made in the same way as they would be in the core code (good
  832. //  for portability).
  833.  
  834. //  Values for the "flags" field of print_file
  835.  
  836. #define PRT_MESSAGE 1         //  Print as an RFC822 message
  837. #define PRT_REFORMAT 2        //  Reformat long lines when printing
  838. #define PRT_TIDY 4            //  Print only "important" headers
  839. #define PRT_FOOTER 8          //  Print a footer on each page
  840. #define PRT_NOHEADERS 16      //  Print no message headers
  841. #define PRT_FIRSTONLY 32      //  Print only first line of headers
  842. #define PRT_ITALICS 64        //  Print quoted text in italics
  843.  
  844. extern M_INTERFACE *mi;
  845.  
  846. #define get_variable(x) (mi->get_variable (x))
  847. #define is_local_address(a,u,s) (mi->is_local_address (a, u, s))
  848. #define is_group(a,h,g) (mi->is_group (a, h, g))
  849. #define parse_address(t,s,l) (mi->parse_address (t, s, l))
  850. #define extract_one_address(d,s,o) (mi->extract_one_address (d, s, o))
  851. #define extract_cqtext(d,s,l) (mi->extract_cqtext (d, s, l))
  852. #define dlist_info(d,l,n,a,e,m) (mi->dlist_info(d, l, n, a, e, m))
  853. #define send_notification(u,h,m) (mi->send_notification (u, h, m))
  854. #define get_delivery_path(p,u,h) (mi->get_delivery_path (p, u, h))
  855. #define get_date_and_time(b) (mi->get_date_and_time (b))
  856. #define verify_password(u,s,p,e) (mi->verify_password (u, s, p, e))
  857. #define write_profile(s,f) (mi->write_profile (s, f))
  858. #define module_state(m,v,s) (mi->module_state (m, v, s))
  859.  
  860. #define ji_scan_first_job(t,m,d) (mi->ji_scan_first_job (t,m,d))
  861. #define ji_scan_next_job(d) (mi->ji_scan_next_job (d))
  862. #define ji_end_scan(d) (mi->ji_end_scan (d))
  863. #define ji_open_job(j) (mi->ji_open_job (j))
  864. #define ji_close_job(j) (mi->ji_close_job (j))
  865. #define ji_rewind_job(j,f) (mi->ji_rewind_job (j,f))
  866. #define ji_dispose_job(j) (mi->ji_dispose_job (j))
  867. #define ji_process_job(j) (mi->ji_process_job (j))
  868. #define ji_delete_job(j) (mi->ji_delete_job (j))
  869. #define ji_abort_job(j,f) (mi->ji_abort_job (j, f))
  870. #define ji_get_job_info(j,i) (mi->ji_get_job_info (j, i))
  871. #define ji_create_job(t,f,s) (mi->ji_create_job (t,f,s))
  872. #define ji_add_element(j,a) (mi->ji_add_element (j,a))
  873. #define ji_add_data(j,d) (mi->ji_add_data (j,d))
  874. #define ji_get_data(j,b,l) (mi->ji_get_data (j,b,l))
  875. #define ji_get_next_element(j,t,i) (mi->ji_get_next_element (j,t,i))
  876. #define ji_set_element_status(j,m,d) (mi->ji_set_element_status (j,m,d))
  877. #define ji_set_element_resolvinfo(j,k,l,m,n) (mi->ji_set_element_resolvinfo (j,k,l,m,n))
  878. #define ji_set_diagnostics(j,w,t) (mi->ji_set_diagnostics (j,w,t))
  879. #define ji_get_diagnostics(j,w,f) (mi->ji_get_diagnostics (j,w,f))
  880. #define ji_increment_time(t,s) (mi->ji_increment_time (t,s))
  881. #define ji_tell(j,s) (mi->ji_tell (j,s))
  882. #define ji_seek(j,o,s) (mi->ji_seek(j,o,s))
  883. #define ji_set_job_flags(j,f) (mi->ji_set_job_flags(j,f))
  884. #define ji_get_job_by_id(i) (mi->ji_get_job_by_id(i))
  885. #define ji_get_job_times(j,s,r) (mi->ji_get_job_times(j,s,r))
  886.  
  887. #define get_first_group_member(g,h,m,l,d) (mi->get_first_group_member(g,h,m,l,d))
  888. #define get_next_group_member(m,l,d) (mi->get_next_group_member(m,l,d))
  889. #define end_group_scan(d) (mi->end_group_scan(d))
  890. #define is_valid_local_user(a,u,h) (mi->is_valid_local_user(a,u,h))
  891. #define is_group_member(h,u,g) (mi->is_group_member(h,u,g))
  892. #define get_first_user_details(h,n,u,ul,a,al,f,fl,d) (mi->get_first_user_details(h,n,u,ul,a,al,f,fl,d))
  893. #define get_next_user_details(u,ul,a,al,f,fl,d) (mi->get_next_user_details(u,ul,a,al,f,fl,d))
  894. #define get_user_details(h,m,u,ul,a,al,f,fl) (mi->get_user_details(h,m,u,ul,a,al,f,fl))
  895. #define end_user_scan(d) (mi->end_user_scan(d))
  896. #define read_pmprop(u,s,p) (mi->read_pmprop(u,s,p))
  897. #define change_ownership(f,h,n) (mi->change_ownership(f,h,n))
  898. #define begin_single_delivery(u,s,d) (mi->begin_single_delivery(u,s,d))
  899. #define end_single_delivery(d) (mi->end_single_delivery(d))
  900.  
  901. #define mercury_command(s,p1,p2) (mi->mercury_command(s,p1,p2))
  902. #define get_date_string(s,b,d) (mi->get_date_string(s,b,d))
  903. #define rfc822_time(s) (mi->rfc822_time(s))
  904. #define rfc821_time(s) (mi->rfc821_time(s))
  905.  
  906. #define fm_open_file(p,f) (mi->fm_open_file(p,f))
  907. #define fm_open_message(i,f) (mi->fm_open_message(i,f))
  908. #define fm_close_message(i) (mi->fm_close_message(i))
  909. #define fm_gets(b,m,i) (mi->fm_gets(b,m,i))
  910. #define fm_getc(i) (mi->fm_getc(i))
  911. #define fm_ungetc(c,i) (mi->fm_ungetc(c,i))
  912. #define fm_read(i,b,s) (mi->fm_read(i,b,s))
  913. #define fm_getpos(f) (mi->fm_getpos(f))
  914. #define fm_setpos(f,o) (mi->fm_setpos(f,o))
  915. #define fm_get_folded_line(f,l,x) (mi->fm_get_folded_line(f,l,x))
  916. #define fm_find_header(i,n,b,l) (mi->fm_find_header(i,n,b,l))
  917. #define fm_extract_message(j,n,f) (mi->fm_extract_message(j,n,f))
  918.  
  919. #define parse_header(f,m) (mi->parse_header(f,m))
  920. #define mime_prep_message(i,f,h) (mi->mime_prep_message(i,f,h))
  921. #define parse_mime(i,m) (mi->parse_mime(i,m))
  922. #define free_mime(m) (mi->free_mime(m))
  923. #define fake_imessage(i,s,m,e,b) (mi->fake_imessage(i,s,m,e,b))
  924. #define decode_mime_header(d,s) (mi->decode_mime_header(d,s))
  925. #define encode_mime_header(d,s,r) (mi->encode_mime_header(d,s,r))
  926.  
  927. #define om_create_message(m,f) (mi->om_create_message(m,f))
  928. #define om_dispose_message(m) (mi->om_dispose_message(m))
  929. #define om_add_field(m,s,d) (mi->om_add_field(m,s,d))
  930. #define om_add_attachment(m,f,t,d,e,g,r) (mi->om_add_attachment(m,f,t,d,e,g,r))
  931. #define om_write_message(m,f) (mi->om_write_message(m,f))
  932. #define om_send_message(m,e) (mi->om_send_message(m,e))
  933.  
  934. #define encode_base64_str(d,s,l) (mi->encode_base64_str(d,s,l))
  935. #define decode_base64_str(d,s,t) (mi->decode_base64_str(d,s,t))
  936.  
  937. #define st_register_module(m) (mi->st_register_module(m))
  938. #define st_unregister_module(h) (mi->st_unregister_module(h))
  939. #define st_create_category(m,c,t,y,l,f) (mi->st_create_category(m,c,t,y,l,f))
  940. #define st_remove_category(m,c) (mi->st_remove_category(m,c))
  941. #define st_set_hcategory(c,d) (mi->st_set_hcategory(c,d))
  942. #define st_set_category(m,c,d) (mi->st_set_category(m,c,d))
  943.  
  944. #define logstring(l,p,s) (mi->logstring(l,p,s))
  945. // "logdata" has variable parameters and cannot be accessed via a macro
  946.  
  947. #define create_object(n,t,i,f) (mi->create_object(n,t,i,f))
  948. #define set_password(u,h,n,o,s) (mi->set_password(u,h,n,o,s))
  949.  
  950. #define st_get_next_module(m,n) (mi->st_get_next_module(m,n))
  951. #define st_get_next_category(m,h,c,t,l,f) (mi->st_get_next_category(m,h,c,t,l,f))
  952. #define st_get_category_data(c,d) (mi->st_get_category_data(c,d))
  953. #define st_export_stats(m,f,l) (mi->st_export_stats(m,f,l))
  954.  
  955. #define select_printer(d,m) (mi->select_printer(d,m))
  956. #define print_file(f,p,l,m,b,t,u,n,z) (mi->print_file(f,p,l,m,b,t,u,n,z))
  957.  
  958. #endif  //  USES_M_INTERFACE
  959.  
  960. #ifdef __cplusplus
  961. };
  962. #endif
  963.  
  964. #endif  //  _DAEMON_H
  965.  
  966.